<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <p>Proxy--代理</p>
    <script>
        let target = function fn1() {
            console.log('我是fn1，我被调用了，我执行了，我饿了。。。');
        }
        // fn1()
        let handler = {
            apply() {
                console.log('我是p1，我是代理器，我是幕后主使');
            }
        }
        // 拦截 Proxy 实例作为函数调用的操作-实例被调用时，不会执行原函数，而是执行apply对应的函数
        // 当target作为函数被调用时（普通调用，call，apply），不执行target，而是执行apply，冒名顶替
        let p1 = new Proxy(target, handler);
        p1()// 通过代理调用函数


        // ===============  分割线，上下没有关系  ==================

        let objA = { name: 'Bill', age: 20, isLogin: false };
        let handler2 = {
            // 拦截Object.defineProperty的操作，执行这里的代码
            defineProperty(target, key, describe) {
                console.log(target);
                console.log(key);
                console.log(target[key]);
                console.log(describe);
                return true
            }
        }
        let p2 = new Proxy(objA, handler2); 
        p2.age = 22;
        console.log(p2.age);
    </script>
</body>

</html>